using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Xml.Linq;
using Connection;
namespace Entidades
{
    public abstract class DALUsuario
    {
        private const string __ErrorAlta = "No se pudo dar el alta (Usuario), ";
        private const string __ErrorBaja = "No se pudo dar la baja (Usuario), ";
        private const string __ErrorModificacion = "No se pudo hacer la modificacion (Usuario), ";
        private const string __ErrorTraerUno = "No se pudo Traer Uno (Usuario), ";
        private const string __ErrorTraerTodos = "No se pudo Traer Todos (Usuario), ";
        public static void Alta(Usuario Usuario)
        {
            try
            {
                parametrosArray pa = new parametrosArray();
                pa.add("Password", Usuario.Password);
                pa.add("Email", Usuario.Email);
                using (DataSet ds = Connection.Connection.Traer("p_Usuario_Alta", pa))
                {
                    if (ds.Tables.Count > 0)
                    {
                        Usuario.Id = int.Parse(ds.Tables[0].Rows[0][0].ToString());
                    }
                    else
                    {
                        throw new Exception(__ErrorAlta);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorAlta + ex.Message);
            }
        }
        public static void Baja(int Id)
        {
            try
            {
                parametrosArray pa = new parametrosArray();
                pa.add("Id", Id);
                Connection.Connection.Ejecutar("p_Usuario_Baja", pa);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorBaja + ex.Message);
            }
        }
        public static void AltaDefinitiva(int Id)
        {
            try
            {
                parametrosArray pa = new parametrosArray();
                pa.add("Id", Id);
                Connection.Connection.Ejecutar("p_Usuario_AltaDefinitiva", pa);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorBaja + ex.Message);
            }
        }
        public static void Modificar(Usuario Usuario)
        {
            try
            {
                parametrosArray pa = new parametrosArray();
                pa.add("Id", Usuario.Id);
                pa.add("Password", Usuario.Password);
                pa.add("Email", Usuario.Email);
                Connection.Connection.Ejecutar("p_Usuario_Modificacion", pa);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorModificacion + ex.Message);
            }
        }
        public static Usuario traerUno(int Id)
        {
            parametrosArray pa = new parametrosArray();
            pa.add("Id", Id);
            using (DataSet ds = Connection.Connection.Traer("p_Usuario_TraerUno", pa))
            {
                if (ds.Tables.Count > 0)
                {
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        return llenarEntidad(ds.Tables[0].Rows[0]);
                    }
                }
            }
            throw new Exception(__ErrorTraerUno);
        }

        public static Usuario traerUno(string email, string password)
        {
            parametrosArray pa = new parametrosArray();
            pa.add("Email", email);
            pa.add("password", password);
            using (DataSet ds = Connection.Connection.Traer("p_Usuario_TraerUnoXEmailyPassword", pa))
            {
                if (ds.Tables.Count > 0)
                {
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        return llenarEntidad(ds.Tables[0].Rows[0]);
                    }
                }
            }
            //throw new Exception("usuario o clave incorrectos");
            return null;
        }

        public static Usuario TraerUnoXEmail(string Email)
        {
            parametrosArray pa = new parametrosArray();
            pa.add("Email", Email);
            using (DataSet ds = Connection.Connection.Traer("p_Usuario_TraerUnoXEmail", pa))
            {
                if (ds.Tables.Count > 0)
                {
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        return llenarEntidad(ds.Tables[0].Rows[0]);
                    }
                }
            }
            return null;
        }

        internal static List<Usuario> traerUltimosRegistrados()
        {
            List<Usuario> li = new List<Usuario>();
            using (DataSet ds = Connection.Connection.Traer("p_Usuario_traerUltimosRegistrados"))
            {
                if (ds.Tables.Count > 0)
                {
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        foreach (DataRow dr in ds.Tables[0].Rows)
                        {
                            li.Add(llenarEntidad(dr));
                        }
                    }
                }
            }
            return li;
        }

        private static Usuario llenarEntidad(DataRow dr)
        {
            Usuario Usuario = new Usuario();
            if (dr.Table.Columns.Contains("Id"))
            {
                if (!object.ReferenceEquals(dr["Id"], DBNull.Value))
                {
                    Usuario.Id = int.Parse(dr["Id"].ToString());
                }
            }
            if (dr.Table.Columns.Contains("Password"))
            {
                if (!object.ReferenceEquals(dr["Password"], DBNull.Value))
                {
                    Usuario.Password = dr["Password"].ToString();
                }
            }
            if (dr.Table.Columns.Contains("FechaAlta"))
            {
                if (!object.ReferenceEquals(dr["FechaAlta"], DBNull.Value))
                {
                    Usuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                }
            }
            if (dr.Table.Columns.Contains("FechaBaja"))
            {
                if (!object.ReferenceEquals(dr["FechaBaja"], DBNull.Value))
                {
                    Usuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                }
            }
            if (dr.Table.Columns.Contains("Email"))
            {
                if (!object.ReferenceEquals(dr["Email"], DBNull.Value))
                {
                    Usuario.Email = dr["Email"].ToString();
                }
            }
            if (dr.Table.Columns.Contains("ContratacionesHechas"))
            {
                if (!object.ReferenceEquals(dr["ContratacionesHechas"], DBNull.Value))
                {
                    Usuario.cantidadContratacionesHechas = int.Parse(dr["ContratacionesHechas"].ToString());
                }
            }

            if (dr.Table.Columns.Contains("ContratacionesRecibidas"))
            {
                if (!object.ReferenceEquals(dr["ContratacionesRecibidas"], DBNull.Value))
                {
                    Usuario.cantidadContratacionesRecibidas = int.Parse(dr["ContratacionesRecibidas"].ToString());
                }
            }

            if (dr.Table.Columns.Contains("CalificacionesPositivas"))
            {
                if (!object.ReferenceEquals(dr["CalificacionesPositivas"], DBNull.Value))
                {
                    Usuario.cantidadCalificacionesPositivas = int.Parse(dr["CalificacionesPositivas"].ToString());
                }
            }

            if (dr.Table.Columns.Contains("CalificacionesNegativas"))
            {
                if (!object.ReferenceEquals(dr["CalificacionesNegativas"], DBNull.Value))
                {
                    Usuario.cantidadCalificacionesNegativas = int.Parse(dr["CalificacionesNegativas"].ToString());
                }
            }

            if (dr.Table.Columns.Contains("RecomendacionesHechas"))
            {
                if (!object.ReferenceEquals(dr["RecomendacionesHechas"], DBNull.Value))
                {
                    Usuario.cantidadRecomendacionesHechas = int.Parse(dr["RecomendacionesHechas"].ToString());
                }
            }

            if (dr.Table.Columns.Contains("RecomendacionesRecibidas"))
            {
                if (!object.ReferenceEquals(dr["RecomendacionesRecibidas"], DBNull.Value))
                {
                    Usuario.cantidadRecomendacionesRecibidas = int.Parse(dr["RecomendacionesRecibidas"].ToString());
                }
            }

            if (dr.Table.Columns.Contains("PreguntasNoLeidas"))
            {
                if (!object.ReferenceEquals(dr["PreguntasNoLeidas"], DBNull.Value))
                {
                    Usuario.cantidadPreguntasNoLeidas = int.Parse(dr["PreguntasNoLeidas"].ToString());
                }
            }

            if (dr.Table.Columns.Contains("RespuestasNoLeidas"))
            {
                if (!object.ReferenceEquals(dr["RespuestasNoLeidas"], DBNull.Value))
                {
                    Usuario.cantidadRespuestasNoLeidas = int.Parse(dr["RespuestasNoLeidas"].ToString());
                }
            }


            return Usuario;
        }









    }
}
